home *** CD-ROM | disk | FTP | other *** search
- fsqrt:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Entry conditions: 32-bit argument in AM ;
- ; register. ;
- ; Exit conditions: 16-bit square root in ;
- ; d register. ;
- ; Modified: D, E, X, Y ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ldy #0000 ;start with 0 count
- tmxed ;arg in x:e:d
- xgde ;lsw in e, msw in d
- tsta ;msb=0?
- beq fazero ;yes, normalize
- aiy #$01 ;1 shift more
- lsrd ;divide by 2
- rore ;
- lsrd ;next divide by 2
- bita #$ff ;done?
- beq fdzero ;yes
- rore ;finish divide
- aiy #$01 ;1 shift more
- lsrd ;divide by 2 again
- rore ;
- lsrd ;next divide by 2
- bita #$ff ;done?
- beq fdzero ;yes
- rore ;finish divide
- aiy #$01 ;1 shift more
- lsrd ;divide by 2
- rore ;
- lsrd ;next divide by 2
- ;
- fdzero: rore ;normalized argument in d:e
- asld ;;;mult by 2 for table address
- ldx #roottabl+2 ;base address of root table
- adx ;;;add offset
- ldd 0,x ;get nearest root from table
- subd -2,x ;minus the lower root
- lsre ;make the remainder a signed fraction
- fmuls ;b*(xa+1-xa)
- adce -2,x ;b*(xa+1-xa)+xa
- xgdy ;# of shifts, k, in d
- addd #-4 ;d-4 in d
- negd ;4-d in d
- beq fddone ;this is 0
- lsre ;denormalize the result
- addd #-1 ;next
- beq fddone ;
- lsre ;shift back
- addd #-1 ;next
- beq fddone ;
- lsre ;shift back
- ;
- fddone: xgde ;result in d
- rts ;out
- ;
- fazero: cmpb #$3f ;done normalizing?
- bhi fadz ;yes, k=0
- aiy #$01 ;one shift more
- asle ;divide by 2
- rold ;
- asle ;divide by 2 again
- rold ;done
- cmpb #$3f ;done normalizing?
- bhi fadz ;yes, k=2
- aiy #$01 ;one shift more
- asle ;divide by 2
- rold ;
- asle ;and again
- rold ;done
- cmpb #$3f ;done?
- bhi fadz ;yes, k=4
- aiy #$01 ;one shift more
- asle ;divide by 2
- rold ;
- asle ;and again
- rold ;done, k=6
- ;
- fadz: asld ;;;mult by 2 to be table address
- ldx #roottabl+2 ;table base address
- adx ;;;add offset
- ldd 0,x ;get table word
- subd -2,x ;(xa+1-xa)
- lsre ;make remainder a signed fraction
- fmuls ;b*(xa+1-xa)
- adce -2,x ;b*(xa+1-xa)+xa
- lsre ;divide by 16 right off, since arg<224
- lsre ;
- lsre ;
- lsre ;OK
- xgdy ;# of shifts, k, in d
- tstd ;=0?
- beq fazone ;done
- lsre ;denormalize the result, divide by 2
- addd #-1 ;next
- beq fazone ;done
- lsre ;divide by 2
- addd #-1 ;next
- beq fazone ;done
- lsre ;divide by 2
- ;
- fazone: xgde ;result in d
- rts ;out
-
- roottabl:
- dc.w $0
- dc.w $1000
- dc.w $16A1
- dc.w $1BB6
- dc.w $2000
- dc.w $23C7
- dc.w $2731
- dc.w $2A55
- dc.w $2D41
- dc.w $3000
- dc.w $3299
- dc.w $3511
- dc.w $376D
- dc.w $39B0
- dc.w $3BDE
- dc.w $3DF8
- dc.w $4000
- dc.w $41F8
- dc.w $43E2
- dc.w $45BE
- dc.w $478E
- dc.w $4952
- dc.w $4B0C
- dc.w $4CBC
- dc.w $4E62
- dc.w $5000
- dc.w $5196
- dc.w $5323
- dc.w $54AA
- dc.w $562A
- dc.w $57A3
- dc.w $5916
- dc.w $5A82
- dc.w $5BEA
- dc.w $5D4C
- dc.w $5EA8
- dc.w $6000
- dc.w $6153
- dc.w $62A1
- dc.w $63EC
- dc.w $6531
- dc.w $6673
- dc.w $67B1
- dc.w $68EB
- dc.w $6A22
- dc.w $6B55
- dc.w $6C84
- dc.w $6DB1
- dc.w $6EDA
- dc.w $7000
- dc.w $7123
- dc.w $7243
- dc.w $7361
- dc.w $747B
- dc.w $7593
- dc.w $76A9
- dc.w $77BC
- dc.w $78CC
- dc.w $79DA
- dc.w $7AE6
- dc.w $7BEF
- dc.w $7CF7
- dc.w $7DFC
- dc.w $7EFF
- dc.w $8000
- dc.w $80FF
- dc.w $81FC
- dc.w $82F7
- dc.w $83F0
- dc.w $84E8
- dc.w $85DE
- dc.w $86D2
- dc.w $87C4
- dc.w $88B4
- dc.w $89A3
- dc.w $8A90
- dc.w $8B7C
- dc.w $8C66
- dc.w $8D4F
- dc.w $8E36
- dc.w $8F1C
- dc.w $9000
- dc.w $90E3
- dc.w $91C4
- dc.w $92A4
- dc.w $9383
- dc.w $9461
- dc.w $953D
- dc.w $9618
- dc.w $96F2
- dc.w $97CA
- dc.w $98A1
- dc.w $9977
- dc.w $9A4C
- dc.w $9B20
- dc.w $9BF3
- dc.w $9CC4
- dc.w $9D95
- dc.w $9E64
- dc.w $9F33
- dc.w $A000
- dc.w $A0CC
- dc.w $A198
- dc.w $A262
- dc.w $A32B
- dc.w $A3F4
- dc.w $A4BB
- dc.w $A581
- dc.w $A647
- dc.w $A70B
- dc.w $A7CF
- dc.w $A892
- dc.w $A954
- dc.w $AA15
- dc.w $AAD5
- dc.w $AB95
- dc.w $AC53
- dc.w $AD11
- dc.w $ADCE
- dc.w $AE8A
- dc.w $AF45
- dc.w $B000
- dc.w $B0BA
- dc.w $B173
- dc.w $B22B
- dc.w $B2E3
- dc.w $B399
- dc.w $B450
- dc.w $B505
- dc.w $B5BA
- dc.w $B66E
- dc.w $B721
- dc.w $B7D3
- dc.w $B885
- dc.w $B937
- dc.w $B9E7
- dc.w $BA97
- dc.w $BB46
- dc.w $BBF5
- dc.w $BCA3
- dc.w $BD51
- dc.w $BDFD
- dc.w $BEA9
- dc.w $BF55
- dc.w $C000
- dc.w $C0AA
- dc.w $C154
- dc.w $C1FD
- dc.w $C2A6
- dc.w $C34E
- dc.w $C3F6
- dc.w $C49C
- dc.w $C543
- dc.w $C5E9
- dc.w $C68E
- dc.w $C733
- dc.w $C7D7
- dc.w $C87B
- dc.w $C91E
- dc.w $C9C1
- dc.w $CA63
- dc.w $CB04
- dc.w $CBA6
- dc.w $CC46
- dc.w $CCE6
- dc.w $CD86
- dc.w $CE25
- dc.w $CEC4
- dc.w $CF62
- dc.w $D000
- dc.w $D09D
- dc.w $D13A
- dc.w $D1D7
- dc.w $D272
- dc.w $D30E
- dc.w $D3A9
- dc.w $D444
- dc.w $D4DE
- dc.w $D577
- dc.w $D611
- dc.w $D6AA
- dc.w $D742
- dc.w $D7DA
- dc.w $D872
- dc.w $D909
- dc.w $D9A0
- dc.w $DA36
- dc.w $DACC
- dc.w $DB62
- dc.w $DBF7
- dc.w $DC8B
- dc.w $DD20
- dc.w $DDB4
- dc.w $DE47
- dc.w $DEDB
- dc.w $DF6E
- dc.w $E000
- dc.w $E092
- dc.w $E124
- dc.w $E1B5
- dc.w $E246
- dc.w $E2D7
- dc.w $E367
- dc.w $E3F7
- dc.w $E487
- dc.w $E516
- dc.w $E5A5
- dc.w $E633
- dc.w $E6C1
- dc.w $E74F
- dc.w $E7DD
- dc.w $E86A
- dc.w $E8F7
- dc.w $E983
- dc.w $EA0F
- dc.w $EA9B
- dc.w $EB27
- dc.w $EBB2
- dc.w $EC3D
-
-